package com.zz.util;

import com.zz.sort.SortZZ;

import java.util.Arrays;

public class ArrUtil {
    /**
     * 生成int数组，内容随机
     *
     * @param num 数组长度
     * @param pre 最小数
     * @param suf 最大数
     * @return
     */
    public static int[] suiArr(int num, int pre, int suf) {
        int[] arr = new int[num];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) Math.floor(Math.random() * (suf - pre) + pre);
        }
        return arr;
    }

    /**
     * 生成一个新的数组，可以认为是深拷贝
     *
     * @param arr
     * @return
     */
    public static int[] newArr(int[] arr) {
        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }

    /**
     * 比对两个数组是否元素相等
     *
     * @param arr1
     * @param arr2
     * @return
     */
    public static boolean compareArr(int[] arr1, int[] arr2) {
        if (arr1 != null && arr2 != null && arr1.length == arr2.length) {
            for (int i = 0; i < arr1.length; i++) {
                if (arr1[i] != arr2[i]) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 对数器
     *
     * @param ci 对数次数
     * @return
     */
    public static boolean batchCompareArr(int ci) {
        return batchCompareArr(ci, 1000, 1, 3000);
    }

    /**
     * 对数器
     *
     * @param ci  对数次数
     * @param num 数组长度
     * @param pre 最小值
     * @param suf 最大值
     * @return
     */
    public static boolean batchCompareArr(int ci, int num, int pre, int suf) {
        for (int i = 0; i < ci; i++) {
            int[] arr1 = suiArr(num, pre, suf);
            int[] arr2 = newArr(arr1);
            SortZZ.mergeSort2(arr2);
            SortZZ.megerSort(arr1);
            boolean b = compareArr(arr1, arr2);
            if (!b) {
                System.out.println("第" + (i+1) + "次比较");
                System.out.println(Arrays.toString(arr1));
                System.out.println(Arrays.toString(arr2));
                return b;
            }
        }
        return true;
    }

    /**
     * 交换数组中两个下标中的数据
     *
     * @param arr
     * @param i
     * @param j
     */
    public static void exch(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 二分查找，找到后返回对应的下标，找不到返回-1
     *
     * @param arr   一个升序后的数组
     * @param value 具体查找的值
     * @return
     */
    public static int binarySearch(int[] arr, int value) {
        int start = 0;
        int end = arr.length - 1;
        while (start <= end) {
            int index = start + (end - start) / 2;
            if (arr[index] > value) {
                end = index - 1;
            } else if (arr[index] < value) {
                start = index + 1;
            } else {
                return index;
            }
        }
        return -1;
    }
}
